home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / pack.a < prev    next >
Encoding:
Text File  |  2001-09-16  |  5.3 KB  |  325 lines

  1. *******************************************************
  2. **     XFD external decruncher for pack Cruncher     **
  3. **        written by Mr. Larmer / Wanted Team        **
  4. **      shortened and fixed by SDI in 1999-2001      **
  5. *******************************************************
  6.  
  7.         INCLUDE    AINCLUDE:IncDirs.i
  8.         INCLUDE    "libraries/xfdmaster.i"
  9.  
  10.         * head function for tests
  11. *        INCLUDE    "xfdExeHead.a"
  12.  
  13. ; xfdForeman structure MUST be first thing in all external decrunchers
  14.  
  15. ForeMan        moveq    #-1,d0        ;security
  16.         rts
  17.         dc.l    XFDF_ID        ;id
  18.         dc.w    1        ;version
  19.         dc.w    0
  20.         dc.l    0,0        ;private
  21.         dc.l    S_pack        ;first slave
  22.  
  23.         dc.b    "$VER: pack 2.1 (07.07.2001)",0
  24. N_pack        dc.b    "(pack) Data Cruncher",0
  25.         EVEN
  26.  
  27. **************************************************
  28.  
  29. ; xfdSlave structure: this one doesn't support segment decrunching
  30.  
  31. S_pack        dc.l    0        ;no more slaves
  32.         dc.w    2        ;version
  33.         dc.w    39        ;master version
  34.         dc.l    N_pack        ;name
  35.         dc.w    XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
  36.         dc.w    0
  37.         dc.l    RB_pack        ;recog buffer
  38.         dc.l    DB_pack        ;decrunch buffer
  39.         dc.l    0        ;recog segment
  40.         dc.l    0        ;decrunch segment
  41.         dc.w    0,0
  42.         dc.l    8+2
  43.  
  44. RB_pack        MOVEQ    #0,D0
  45.         CMP.L    #"pack",(A0)
  46.         BNE.B    .Exit
  47.         TST.B    4(A0)
  48.         BNE.B    .Exit
  49.         MOVE.L    4(A0),D0
  50.         MOVE.L    D0,xfdrr_FinalTargetLen(A1)
  51.         MOVE.L    D0,xfdrr_MinTargetLen(A1)
  52.         MOVE.L    D0,xfdrr_MinSourceLen(A1)
  53.         MOVEQ    #1,D0
  54. .Exit        RTS
  55.  
  56. ;-------------------------------------------------
  57.  
  58. DB_pack        MOVEM.L    D2-D7/A2-A6,-(A7)
  59.         MOVE.L    xfdbi_UserTargetBuf(A0),A6
  60.         MOVE.L    xfdbi_SourceBuffer(A0),A5
  61.  
  62.         LEA    -$C80(A7),A7
  63.         MOVE.L    A7,A3
  64.         BSR.B    D_pack
  65.         ; return result is set correctly
  66.         LEA    $C80(A7),A7
  67.         TST.L    D0
  68.         BNE.B    .Exit
  69.         MOVE.W    #XFDERR_CORRUPTEDDATA,xfdbi_Error(a5)
  70. .Exit        MOVEM.L    (A7)+,D2-D7/A2-A6
  71.         RTS
  72.  
  73. **************************************************
  74.  
  75. D_pack        movem.l    D0-D7/A0-A6,-(SP)
  76.         move.l  (A5)+,D0    * skip ID
  77.         move.l    (A5)+,-(SP)
  78.         move.l    (A5)+,D6
  79.         moveq    #$1F,D7
  80.         moveq    #$20,D0
  81.         lea    (A3),A0
  82.         bsr.w    lbC00013E
  83.         moveq    #0,D0
  84.         lea    $80(A3),A0
  85.         bsr.w    lbC00013E
  86.         moveq    #0,D0
  87.         lea    $480(A3),A0
  88.         bsr.w    lbC00013E
  89.         moveq    #0,D0
  90.         lea    $880(A3),A0
  91.         bsr.w    lbC00013E
  92.         move.l    (SP)+,D0
  93.         moveq    #$1F,D5
  94.         sub.w    D7,D5
  95.         asl.l    D5,D6
  96.         lea    lbW0001D8(PC),A1
  97.         lea    lbL000214(PC),A2
  98. lbC00006E:
  99.         lea    $80(A3),A0
  100.         bsr.w    lbC00010A
  101.         moveq    #0,D4
  102.         move.b    D2,D4
  103.         cmpi.b    #$FF,D4
  104.         bcs.s    lbC00009C
  105. lbC000080:
  106.         moveq    #0,D2
  107.         moveq    #7,D3
  108. lbC000084:
  109.         add.l    D6,D6
  110.         addx.l    D2,D2
  111.         dbra    D7,lbC000090
  112.         move.l    (A5)+,D6
  113.         moveq    #$1F,D7
  114. lbC000090:
  115.         dbra    D3,lbC000084
  116.         add.w    D2,D4
  117.         cmpi.w    #$FF,D2
  118.         beq.s    lbC000080
  119. lbC00009C:
  120.         move.w    D4,D1
  121.         beq.s    lbC0000AC
  122.         lea    $880(A3),A0
  123. lbC0000A4:
  124.         bsr.s    lbC00010A
  125.         move.b    D2,(A6)+
  126.         subq.w    #1,D1
  127.         bne.s    lbC0000A4
  128. lbC0000AC:
  129.         sub.l    D4,D0
  130.         bmi.w    lbC0001BC
  131.         beq.s    lbC000104
  132.         lea    (A3),A0
  133.         bsr.s    lbC00010A
  134.         moveq    #0,D1
  135.         moveq    #0,D3
  136.         move.b    D2,D3
  137.         add.w    D3,D3
  138.         move.w    0(A2,D3.W),D2
  139.         beq.s    lbC0000DA
  140.         subq.w    #1,D2
  141. lbC0000CA:
  142.         add.l    D6,D6
  143.         addx.l    D1,D1
  144.         dbra    D7,lbC0000D6
  145.         move.l    (A5)+,D6
  146.         moveq    #$1F,D7
  147. lbC0000D6:
  148.         dbra    D2,lbC0000CA
  149. lbC0000DA:
  150.         or.w    0(A1,D3.W),D1
  151.         lea    $480(A3),A0
  152.         bsr.b    lbC00010A
  153.         moveq    #0,D3
  154.         move.b    D2,D3
  155.         move.w    D3,D2
  156.         lea    (A6),A4
  157.         suba.w    D2,A4
  158.         suba.w    D1,A4
  159.         subq.w    #1,D2
  160. lbC0000F4:
  161.         move.b    (A4)+,(A6)+
  162.         dbra    D2,lbC0000F4
  163.         sub.l    D3,D0
  164.         bmi.w    lbC0001BC
  165.         bne.w    lbC00006E
  166. lbC000104:
  167.         movem.l    (SP)+,D0-D7/A0-A6
  168.         moveq    #1,D0
  169.         rts
  170.  
  171. lbC00010A:
  172.         moveq    #0,D2
  173. lbC00010C:
  174.         moveq    #0,D3
  175.         add.l    D6,D6
  176.         addx.w    D3,D3
  177.         add.w    D3,D3
  178.         add.w    D3,D2
  179.         move.w    0(A0,D2.W),D2
  180.         bmi.s    lbC000134
  181. lbC00011C:
  182.         dbra    D7,lbC00010C
  183.         move.l    (A5)+,D6
  184.         moveq    #$1F,D7
  185.         moveq    #0,D3
  186.         add.l    D6,D6
  187.         addx.w    D3,D3
  188.         add.w    D3,D3
  189.         add.w    D3,D2
  190.         move.w    0(A0,D2.W),D2
  191.         bpl.s    lbC00011C
  192. lbC000134:
  193.         dbra    D7,lbC00013C
  194.         move.l    (A5)+,D6
  195.         moveq    #$1F,D7
  196. lbC00013C:
  197.         rts
  198. lbC00013E:
  199.         lea    (A0),A1
  200.         clr.l    (A1)+
  201.         moveq    #0,D1
  202. lbC000144:
  203.         bsr.s    lbC000192
  204.         beq.s    lbC00018A
  205.         moveq    #5,D5
  206.         bsr.s    lbC0001A2
  207.         move.w    D4,D3
  208.         move.w    D4,D5
  209.         bsr.s    lbC0001A2
  210.         lea    (A0),A2
  211.         moveq    #0,D2
  212.         subq.w    #1,D3
  213.         beq.s    lbC000176
  214. lbC00015A:
  215.         btst    D3,D4
  216.         beq.s    lbC000160
  217.         addq.w    #2,D2
  218. lbC000160:
  219.         move.w    0(A0,D2.W),D5
  220.         bne.s    lbC000170
  221.         move.l    A1,D5
  222.         sub.l    A0,D5
  223.         move.w    D5,0(A0,D2.W)
  224.         clr.l    (A1)+
  225. lbC000170:
  226.         move.w    D5,D2
  227.         subq.w    #1,D3
  228.         bne.s    lbC00015A
  229. lbC000176:
  230.         btst    D3,D4
  231.         beq.s    lbC00017C
  232.         addq.w    #2,D2
  233. lbC00017C:
  234.         tst.w    0(A0,D2.W)
  235.         bne.s    lbC0001C0
  236.         move.b    D1,1(A0,D2.W)
  237.         st    0(A0,D2.W)
  238. lbC00018A:
  239.         addq.b    #1,D1
  240.         cmp.b    D0,D1
  241.         bne.s    lbC000144
  242.         rts
  243. lbC000192:
  244.         move.w    D7,D4
  245.         move.l    D6,D5
  246.         dbra    D7,lbC00019E
  247.         moveq    #$1F,D7
  248.         move.l    (A5)+,D6
  249. lbC00019E:
  250.         btst    D4,D5
  251.         rts
  252. lbC0001A2:
  253.         moveq    #0,D4
  254.         subq.w    #1,D5
  255.         bmi.s    lbC0001BA
  256. lbC0001A8:
  257.         btst    D7,D6
  258.         beq.s    lbC0001AE
  259.         bset    D5,D4
  260. lbC0001AE:
  261.         dbra    D7,lbC0001B6
  262.         moveq    #$1F,D7
  263.         move.l    (A5)+,D6
  264. lbC0001B6:
  265.         dbra    D5,lbC0001A8
  266. lbC0001BA:
  267.         rts
  268. lbC0001BC:
  269.         movem.l    (SP)+,D0-D7/A0-A6
  270.         moveq    #0,D0
  271.         rts
  272. lbC0001C0:
  273.         pea    lbC0001BC(pc)
  274.         rts
  275.  
  276. lbW0001D8:
  277.         dc.w    0
  278.         dc.w    1
  279.         dc.w    2
  280.         dc.w    3
  281.         dc.w    4
  282.         dc.w    6
  283.         dc.w    8
  284.         dc.w    12
  285.         dc.w    $10
  286.         dc.w    $18
  287.         dc.w    $20
  288.         dc.w    $30
  289.         dc.w    $40
  290.         dc.w    $60
  291.         dc.w    $80
  292.         dc.w    $C0
  293.         dc.w    $100
  294.         dc.w    $180
  295.         dc.w    $200
  296.         dc.w    $300
  297.         dc.w    $400
  298.         dc.w    $600
  299.         dc.w    $800
  300.         dc.w    $C00
  301.         dc.w    $1000
  302.         dc.w    $1800
  303.         dc.w    $2000
  304.         dc.w    $3000
  305.         dc.w    $4000
  306.         dc.w    $6000
  307. lbL000214:
  308.         dc.l    0
  309.         dc.l    0
  310.         dc.l    $10001
  311.         dc.l    $20002
  312.         dc.l    $30003
  313.         dc.l    $40004
  314.         dc.l    $50005
  315.         dc.l    $60006
  316.         dc.l    $70007
  317.         dc.l    $80008
  318.         dc.l    $90009
  319.         dc.l    $A000A
  320.         dc.l    $B000B
  321.         dc.l    $C000C
  322.         dc.l    $D000D
  323.  
  324.         END
  325.